home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / symm.md / nlist.c < prev   
C/C++ Source or Header  |  1990-08-10  |  2KB  |  100 lines

  1. /*
  2.  * Copyright (c) 1980 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6.  
  7. #if defined(LIBC_SCCS) && !defined(lint)
  8. static char sccsid[] = "@(#)nlist.c    5.2 (Berkeley) 3/9/86";
  9. #endif LIBC_SCCS and not lint
  10.  
  11. #include <sys/types.h>
  12. #include <a.out.h>
  13. #include <stdio.h>
  14.  
  15. /*
  16.  * nlist - retreive attributes from name list (string table version)
  17.  */
  18. nlist(name, list)
  19.     char *name;
  20.     struct nlist *list;
  21. {
  22.     register struct nlist *p, *q;
  23.     register char *s1, *s2;
  24.     register n, m;
  25.     int maxlen, nreq;
  26.     FILE *f;
  27.     FILE *sf;
  28.     off_t sa;        /* symbol address */
  29.     off_t ss;        /* start of strings */
  30.     struct exec buf;
  31.     struct nlist space[BUFSIZ/sizeof (struct nlist)];
  32.  
  33.     maxlen = 0;
  34.     for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
  35.         q->n_type = 0;
  36.         q->n_value = 0;
  37.         q->n_desc = 0;
  38.         q->n_other = 0;
  39.         n = strlen(q->n_un.n_name);
  40.         if (n > maxlen)
  41.             maxlen = n;
  42.     }
  43.     f = fopen(name, "r");
  44.     if (f == NULL)
  45.         return (-1);
  46.     fread((char *)&buf, sizeof buf, 1, f);
  47.     if (N_BADMAG(buf)) {
  48.         fclose(f);
  49.         return (-1);
  50.     }
  51.     sf = fopen(name, "r");
  52.     if (sf == NULL) {
  53.         /* ??? */
  54.         fclose(f);
  55.         return(-1);
  56.     }
  57.     sa = N_SYMOFF(buf);
  58.     ss = sa + buf.a_syms;
  59.     n = buf.a_syms;
  60.     fseek(f, sa, 0);
  61.     while (n) {
  62.         m = sizeof (space);
  63.         if (n < m)
  64.             m = n;
  65.         if (fread((char *)space, m, 1, f) != 1)
  66.             break;
  67.         n -= m;
  68.         for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
  69.             char nambuf[BUFSIZ];
  70.  
  71.             if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
  72.                 continue;
  73.             fseek(sf, ss+q->n_un.n_strx, 0);
  74.             fread(nambuf, maxlen+1, 1, sf);
  75.             for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
  76.                 s1 = p->n_un.n_name;
  77.                 s2 = nambuf;
  78.                 while (*s1) {
  79.                     if (*s1++ != *s2++)
  80.                         goto cont;
  81.                 }
  82.                 if (*s2)
  83.                     goto cont;
  84.                 p->n_value = q->n_value;
  85.                 p->n_type = q->n_type;
  86.                 p->n_desc = q->n_desc;
  87.                 p->n_other = q->n_other;
  88.                 if (--nreq == 0)
  89.                     goto alldone;
  90.                 break;
  91.         cont:        ;
  92.             }
  93.         }
  94.     }
  95. alldone:
  96.     fclose(f);
  97.     fclose(sf);
  98.     return (nreq);
  99. }
  100.